📄 media_import.c
字号:
if (!track) { e = gf_isom_last_error(import->dest); goto exit; } gf_isom_set_track_enabled(import->dest, track, 1); if (import->esd && !import->esd->ESID) import->esd->ESID = gf_isom_get_track_id(import->dest, track); /*setup data ref*/ urn = url = NULL; if (import->flags & GF_IMPORT_USE_DATAREF) { url = gf_isom_get_filename(import->orig); if (!gf_isom_is_self_contained(import->orig, track_in, 1)) { e = gf_isom_get_data_reference(import->orig, track_in, 1, &url, &urn); if (e) goto exit; } } e = gf_isom_new_mpeg4_description(import->dest, track, origin_esd, (char *) url, (char *) urn, &di); if (e) goto exit; /*copy over language*/ lang[3] = 0; gf_isom_get_media_language(import->orig, track_in, lang); gf_isom_set_media_language(import->dest, track, lang); } else { if (! (import->flags & GF_IMPORT_KEEP_ALL_TRACKS) ) { mstype = gf_isom_get_media_subtype(import->orig, track_in, 1); switch (mstype) { case GF_ISOM_SUBTYPE_MPEG4: case GF_ISOM_SUBTYPE_MPEG4_CRYP: case GF_ISOM_SUBTYPE_AVC_H264: case GF_ISOM_SUBTYPE_3GP_H263: case GF_ISOM_SUBTYPE_3GP_AMR: case GF_ISOM_SUBTYPE_3GP_AMR_WB: case GF_ISOM_SUBTYPE_3GP_EVRC: case GF_ISOM_SUBTYPE_3GP_QCELP: case GF_ISOM_SUBTYPE_3GP_SMV: break; default: switch (mtype) { case GF_ISOM_MEDIA_HINT: case GF_ISOM_MEDIA_TEXT: break; default: return gf_import_message(import, GF_OK, "IsoMedia import - skipping track ID %d (unknown type \'%s\')", trackID, gf_4cc_to_str(mstype)); } } } e = gf_isom_clone_track(import->orig, track_in, import->dest, (import->flags & GF_IMPORT_USE_DATAREF), &track); is_clone = 1; di = 1; if (e) goto exit; } if (e) goto exit; import->final_trackID = gf_isom_get_track_id(import->dest, track); switch (mtype) { case GF_ISOM_MEDIA_VISUAL: if (!is_clone) { gf_isom_set_visual_info(import->dest, track, di, w, h); gf_media_update_par(import->dest, track); } gf_import_message(import, GF_OK, "IsoMedia import - track ID %d - Video (size %d x %d)", trackID, w, h); break; case GF_ISOM_MEDIA_AUDIO: { if (!is_clone) gf_isom_set_audio_info(import->dest, track, di, (sbr==2) ? sbr_sr : sr, (ch>1) ? 2 : 1, bps); if (sbr) { gf_import_message(import, GF_OK, "IsoMedia import - track ID %d - HE-AAC (SR %d - SBR-SR %d - %d channels)", trackID, sr, sbr_sr, ch); } else { gf_import_message(import, GF_OK, "IsoMedia import - track ID %d - Audio (SR %d - %d channels)", trackID, sr, ch); } } break; case GF_ISOM_MEDIA_SUBPIC: if (!is_clone) { gf_isom_set_track_layout_info(import->dest, track, w << 16, h << 16, trans_x, trans_y, layer); } gf_import_message(import, GF_OK, "IsoMedia import - track ID %d - VobSub (size %d x %d)", trackID, w, h); break; default: { char szT[5]; mstype = gf_isom_get_mpeg4_subtype(import->orig, track_in, di); if (!mstype) mstype = gf_isom_get_media_subtype(import->orig, track_in, di); strcpy(szT, gf_4cc_to_str(mtype)); gf_import_message(import, GF_OK, "IsoMedia import - track ID %d - media type \"%s:%s\"", trackID, szT, gf_4cc_to_str(mstype)); } break; } duration = (u32) (((Double)import->duration * gf_isom_get_media_timescale(import->orig, track_in)) / 1000); num_samples = gf_isom_get_sample_count(import->orig, track_in); for (i=0; i<num_samples; i++) { if (import->flags & GF_IMPORT_USE_DATAREF) { samp = gf_isom_get_sample_info(import->orig, track_in, i+1, &di, &offset); if (!samp) { e = gf_isom_last_error(import->orig); goto exit; } e = gf_isom_add_sample_reference(import->dest, track, di, samp, offset); } else { samp = gf_isom_get_sample(import->orig, track_in, i+1, &di); e = gf_isom_add_sample(import->dest, track, di, samp); } sampDTS = samp->DTS; gf_isom_sample_del(&samp); gf_set_progress("Importing ISO File", i+1, num_samples); if (duration && (sampDTS > duration) ) break; if (import->flags & GF_IMPORT_DO_ABORT) break; if (e) break; } if (import->esd) { if (!import->esd->slConfig) { import->esd->slConfig = origin_esd ? origin_esd->slConfig : NULL; if (origin_esd) origin_esd->slConfig = NULL; } if (!import->esd->decoderConfig) { import->esd->decoderConfig = origin_esd ? origin_esd->decoderConfig : NULL; if (origin_esd) origin_esd->decoderConfig = NULL; } } MP4T_RecomputeBitRate(import->dest, track);exit: if (origin_esd) gf_odf_desc_del((GF_Descriptor *) origin_esd); return e;}#include "mpeg2_ps.h"GF_Err gf_import_mpeg_ps_video(GF_MediaImporter *import){ GF_Err e; mpeg2ps_t *ps; Double FPS; char *buf; u8 ftype; u32 track, di, streamID, mtype, w, h, nb_streams, buf_len, frames, ref_frame, timescale, duration, file_size, dts_inc, last_pos; Bool destroy_esd; if (import->flags & GF_IMPORT_USE_DATAREF) return gf_import_message(import, GF_NOT_SUPPORTED, "Cannot use data referencing with MPEG-1/2 files"); /*no auto frame-rate detection*/ if (import->video_fps == 10000.0) import->video_fps = 25.0; ps = mpeg2ps_init(import->in_name); if (!ps) return gf_import_message(import, GF_NON_COMPLIANT_BITSTREAM, "Failed to open MPEG file %s", import->in_name); if (import->flags & GF_IMPORT_PROBE_ONLY) { u32 i, nb_v_str; import->nb_tracks = 0; nb_v_str = nb_streams = mpeg2ps_get_video_stream_count(ps); for (i=0; i<nb_streams; i++) { import->tk_info[import->nb_tracks].track_num = i+1; import->tk_info[import->nb_tracks].type = GF_ISOM_MEDIA_VISUAL; import->tk_info[import->nb_tracks].flags = GF_IMPORT_OVERRIDE_FPS; import->tk_info[import->nb_tracks].video_info.FPS = mpeg2ps_get_video_stream_framerate(ps, i); import->tk_info[import->nb_tracks].video_info.width = mpeg2ps_get_video_stream_width(ps, i); import->tk_info[import->nb_tracks].video_info.height = mpeg2ps_get_video_stream_height(ps, i); import->tk_info[import->nb_tracks].video_info.par = mpeg2ps_get_video_stream_aspect_ratio(ps, i); import->tk_info[import->nb_tracks].media_type = GF_4CC('M', 'P', 'G', '1'); if (mpeg2ps_get_video_stream_type(ps, i) == MPEG_VIDEO_MPEG2) import->tk_info[import->nb_tracks].media_type ++; import->nb_tracks++; } nb_streams = mpeg2ps_get_audio_stream_count(ps); for (i=0; i<nb_streams; i++) { import->tk_info[import->nb_tracks].track_num = nb_v_str + i+1; import->tk_info[import->nb_tracks].type = GF_ISOM_MEDIA_AUDIO; switch (mpeg2ps_get_audio_stream_type(ps, i)) { case MPEG_AUDIO_MPEG: import->tk_info[import->nb_tracks].media_type = GF_4CC('M','P','G','A'); break; case MPEG_AUDIO_AC3: import->tk_info[import->nb_tracks].media_type = GF_4CC('A','C','3',' '); break; case MPEG_AUDIO_LPCM: import->tk_info[import->nb_tracks].media_type = GF_4CC('L','P','C','M'); break; default: import->tk_info[import->nb_tracks].media_type = GF_4CC('U','N','K',' '); break; } import->tk_info[import->nb_tracks].audio_info.sample_rate = mpeg2ps_get_audio_stream_sample_freq(ps, i); import->tk_info[import->nb_tracks].audio_info.nb_channels = mpeg2ps_get_audio_stream_channels(ps, i); import->nb_tracks ++; } mpeg2ps_close(ps); return GF_OK; } streamID = 0; nb_streams = mpeg2ps_get_video_stream_count(ps); if ((nb_streams>1) && !import->trackID) { mpeg2ps_close(ps); return gf_import_message(import, GF_BAD_PARAM, "%d video tracks in MPEG file - please indicate track to import", nb_streams); } /*audio*/ if (import->trackID>nb_streams) { mpeg2ps_close(ps); return GF_OK; } if (import->trackID) streamID = import->trackID - 1; if (streamID>=nb_streams) { mpeg2ps_close(ps); return gf_import_message(import, GF_BAD_PARAM, "Desired video track not found in MPEG file (%d visual streams)", nb_streams); } w = mpeg2ps_get_video_stream_width(ps, streamID); h = mpeg2ps_get_video_stream_height(ps, streamID); mtype = (mpeg2ps_get_video_stream_type(ps, streamID) == MPEG_VIDEO_MPEG2) ? 0x61 : 0x6A; FPS = mpeg2ps_get_video_stream_framerate(ps, streamID); if (import->video_fps) FPS = (Double) import->video_fps; get_video_timing(FPS, ×cale, &dts_inc); duration = import->duration*timescale; duration /= 1000; destroy_esd = 0; if (!import->esd) { destroy_esd = 1; import->esd = gf_odf_desc_esd_new(0); } track = gf_isom_new_track(import->dest, import->esd->ESID, GF_ISOM_MEDIA_VISUAL, timescale); e = gf_isom_last_error(import->dest); if (!track) goto exit; gf_isom_set_track_enabled(import->dest, track, 1); if (!import->esd->ESID) import->esd->ESID = gf_isom_get_track_id(import->dest, track); import->final_trackID = import->esd->ESID; if (!import->esd->decoderConfig) import->esd->decoderConfig = (GF_DecoderConfig *) gf_odf_desc_new(GF_ODF_DCD_TAG); if (!import->esd->slConfig) import->esd->slConfig = (GF_SLConfig *) gf_odf_desc_new(GF_ODF_SLC_TAG); import->esd->slConfig->timestampResolution = timescale; if (import->esd->decoderConfig->decoderSpecificInfo) gf_odf_desc_del((GF_Descriptor *) import->esd->decoderConfig->decoderSpecificInfo); import->esd->decoderConfig->decoderSpecificInfo = NULL; import->esd->decoderConfig->streamType = GF_STREAM_VISUAL; import->esd->decoderConfig->objectTypeIndication = mtype; e = gf_isom_new_mpeg4_description(import->dest, track, import->esd, NULL, NULL, &di); if (e) goto exit; gf_import_message(import, GF_OK, "%s Video import - Resolution %d x %d @ %02.4f FPS", (mtype==0x6A) ? "MPEG-1" : "MPEG-2", w, h, FPS); gf_isom_set_visual_info(import->dest, track, di, w, h); gf_isom_set_cts_packing(import->dest, track, 1); file_size = (u32) mpeg2ps_get_ps_size(ps); last_pos = 0; frames = 1; ref_frame = 1; while (mpeg2ps_get_video_frame(ps, streamID, (u8 **) &buf, &buf_len, &ftype, TS_90000, NULL)) { GF_ISOSample *samp; if ((buf[buf_len - 4] == 0) && (buf[buf_len - 3] == 0) && (buf[buf_len - 2] == 1)) buf_len -= 4; samp = gf_isom_sample_new(); samp->data = buf; samp->dataLength = buf_len; samp->DTS = dts_inc*(frames-1); samp->IsRAP = (ftype==1) ? 1 : 0; samp->CTS_Offset = 0; gf_isom_add_sample(import->dest, track, di, samp); samp->data = NULL; gf_isom_sample_del(&samp); last_pos = (u32) mpeg2ps_get_video_pos(ps, streamID); gf_set_progress("Importing MPEG-PS Video", last_pos/1024, file_size/1024); if (ftype != 3) { gf_isom_modify_cts_offset(import->dest, track, ref_frame, (frames-ref_frame)*dts_inc); ref_frame = frames; } frames++; if (duration && (dts_inc*(frames-1) >= duration) ) break; if (import->flags & GF_IMPORT_DO_ABORT) break; } gf_isom_set_cts_packing(import->dest, track, 0); if (last_pos!=file_size) gf_set_progress("Importing MPEG-PS Video", frames, frames); MP4T_RecomputeBitRate(import->dest, track);exit: if (import->esd && destroy_esd) { gf_odf_desc_del((GF_Descriptor *) import->esd); import->esd = NULL; } mpeg2ps_close(ps); return e;}GF_Err gf_import_mpeg_ps_audio(GF_MediaImporter *import){ GF_Err e; mpeg2ps_t *ps; char *buf; u32 track, di, streamID, mtype, sr, nb_ch, nb_streams, buf_len, frames, hdr, duration, file_size, last_pos; Bool destroy_esd; GF_ISOSample *samp; if (import->flags & GF_IMPORT_PROBE_ONLY) return GF_OK; if (import->flags & GF_IMPORT_USE_DATAREF) return gf_import_message(import, GF_NOT_SUPPORTED, "Cannot use data referencing with MPEG-1/2 files"); ps = mpeg2ps_init(import->in_name); if (!ps) return gf_import_message(import, GF_NON_COMPLIANT_BITSTREAM, "Failed to open MPEG file %s", import->in_name); streamID = 0; nb_streams = mpeg2ps_get_audio_stream_count(ps); if ((nb_streams>1) && !import->trackID) { mpeg2ps_close(ps); return gf_import_message(import, GF_BAD_PARAM, "%d audio tracks in MPEG file - please indicate track to import", nb_streams); } if (import->trackID) { u32 nb_v = mpeg2ps_get_video_stream_count(ps); /*video*/ if (import->trackID<=nb_v) { mpeg2ps_close(ps); return GF_OK; } streamID = import->trackID - 1 - nb_v; } if (streamID>=nb_streams) { mpeg2ps_close(ps); return gf_import_message(import, GF_BAD_PARAM, "Desired audio track not found in MPEG file (%d audio streams)", nb_streams); } mtype = mpeg2ps_get_audio_stream_type(ps, streamID); if (mtype != MPEG_AUDIO_MPEG) { mpeg2ps_close(ps); return gf_import_message(import, GF_NOT_SUPPORTED, "Audio format not supported in MP4"); } if (mpeg2ps_get_audio_frame(ps, streamID, (u8**) &buf, &buf_len, TS_90000, NULL, NULL) == 0) { mpeg2ps_close(ps); return gf_import_message(import, GF_IO_ERR, "Cannot fetch audio frame from MPEG file"); } hdr = GF_4CC(buf[0],buf[1],buf[2],buf[3]); mtype = gf_mp3_object_type_indication(hdr); sr = gf_mp3_sampling_rate(hdr); nb_ch = gf_mp3_num_channels(hdr); destroy_esd = 0; if (!import->esd) { destroy_esd = 1; import->esd = gf_odf_desc_esd_new(0); } track = gf_isom_new_track(import->dest, import->esd->ESID, GF_ISOM_MEDIA_AUDIO, sr); e = gf_isom_last_error(import->dest); if (!track) goto exit; gf_isom_set_track_enabled(import->dest, track, 1); if (!import->esd->ESID) import->esd->ESID = gf_isom_get_track_id(import->dest, track); import->final_trackID = import->esd->ESID; if (!import->esd->decoderConfig) import->esd->decoderConfig = (GF_DecoderConfig *) gf_odf_desc_new(GF_ODF_DCD_TAG); if (!import->esd->slConfig) import->esd->slConfig = (GF_SLConfig *) gf_odf_desc_new(GF_ODF_SLC_TAG); import->esd->slConfig->timestampResolution = sr; if (import->esd->decoderConfig->decoderSpecificInfo) gf_odf_desc_del((GF_Descriptor *) import->esd->decoderConfig->decoderSpecificInfo); import->esd->decoderConfig->decoderSpecificInfo = NULL; import->esd->decoderConfig->streamType = GF_STREAM_AUDIO; import->esd->decoderConfig->objectTypeIndication = mtype; e = gf_isom_new_mpeg4_description(import->dest, track, import->esd, NULL, NULL, &di); if (e) goto exit; gf_isom_set_audio_info(import->dest, track, di, sr, nb_ch, 16); gf_import_message(import, GF_OK, "%s Audio import - sample rate %d - %d channel%s", (mtype==0x6B) ? "MPEG-1" : "MPEG-2", sr, nb_ch, (nb_ch>1) ? "s" : ""); duration = (u32) ((Double)import->duration/1000.0 * sr); samp = gf_isom_sample_new(); samp->IsRAP = 1; samp->DTS = 0; file_size = (u32) mpeg2ps_get_ps_size(ps); last_pos = 0; frames = 0; do { samp->data = buf; samp->dataLength = buf_len; g
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -