int dc_gpac_audio_isom_write(AudioOutputFile * p_aoutf) { GF_Err ret; //AVStream * p_video_stream = // p_voutf->p_fmt->streams[p_voutf->i_vstream_idx]; //AVCodecContext * p_video_codec_ctx = p_video_stream->codec; //AVCodecContext * p_audio_codec_ctx = p_aoutf->p_codec_ctx; p_aoutf->p_sample->data = (char *) p_aoutf->packet.data; p_aoutf->p_sample->dataLength = p_aoutf->packet.size; p_aoutf->p_sample->DTS = p_aoutf->dts; //p_aoutf->p_aframe->pts; p_aoutf->p_sample->IsRAP = 1; //p_aoutf->p_aframe->key_frame;//p_audio_codec_ctx->coded_frame->key_frame; //printf("RAP %d , DTS %ld \n", p_aoutf->p_sample->IsRAP, p_aoutf->p_sample->DTS); ret = gf_isom_fragment_add_sample(p_aoutf->p_isof, 1, p_aoutf->p_sample, 1, p_aoutf->p_codec_ctx->frame_size, 0, 0, 0); p_aoutf->dts += p_aoutf->p_codec_ctx->frame_size; if (ret != GF_OK) { fprintf(stderr, "%s: gf_isom_fragment_add_sample\n", gf_error_to_string(ret)); return -1; } // ret = gf_isom_flush_fragments(p_voutf->p_isof, 1); // if (ret != GF_OK) { // fprintf(stderr, "%s: gf_isom_flush_fragments\n", // gf_error_to_string(ret)); // return -1; // } return 0; }
int dc_gpac_audio_isom_write(AudioOutputFile *audio_output_file) { GF_Err ret; audio_output_file->sample->data = (char *) audio_output_file->packet.data; audio_output_file->sample->dataLength = audio_output_file->packet.size; audio_output_file->sample->DTS = audio_output_file->dts; //audio_output_file->aframe->pts; audio_output_file->sample->IsRAP = RAP; //audio_output_file->aframe->key_frame;//audio_codec_ctx->coded_frame->key_frame; ret = gf_isom_fragment_add_sample(audio_output_file->isof, 1, audio_output_file->sample, 1, audio_output_file->codec_ctx->frame_size, 0, 0, 0); audio_output_file->dts += audio_output_file->codec_ctx->frame_size; if (ret != GF_OK) { GF_LOG(GF_LOG_ERROR, GF_LOG_DASH, ("%s: gf_isom_fragment_add_sample\n", gf_error_to_string(ret))); return -1; } return 0; }
int dc_gpac_video_isom_write(VideoOutputFile *video_output_file) { GF_Err ret; AVCodecContext *video_codec_ctx = video_output_file->codec_ctx; u32 sc_size = 0; u32 nalu_size = 0; u32 buf_len = video_output_file->encoded_frame_size; u8 *buf_ptr = video_output_file->vbuf; GF_BitStream *out_bs = gf_bs_new(NULL, 2 * buf_len, GF_BITSTREAM_WRITE); nalu_size = gf_media_nalu_next_start_code(buf_ptr, buf_len, &sc_size); if (nalu_size != 0) { gf_bs_write_u32(out_bs, nalu_size); gf_bs_write_data(out_bs, (const char*) buf_ptr, nalu_size); } if (sc_size) { buf_ptr += (nalu_size + sc_size); buf_len -= (nalu_size + sc_size); } while (buf_len) { nalu_size = gf_media_nalu_next_start_code(buf_ptr, buf_len, &sc_size); if (nalu_size != 0) { gf_bs_write_u32(out_bs, nalu_size); gf_bs_write_data(out_bs, (const char*) buf_ptr, nalu_size); } buf_ptr += nalu_size; if (!sc_size || (buf_len < nalu_size + sc_size)) break; buf_len -= nalu_size + sc_size; buf_ptr += sc_size; } gf_bs_get_content(out_bs, &video_output_file->sample->data, &video_output_file->sample->dataLength); //video_output_file->sample->data = //(char *) (video_output_file->vbuf + nalu_size + sc_size); //video_output_file->sample->dataLength = //video_output_file->encoded_frame_size - (sc_size + nalu_size); video_output_file->sample->DTS = video_codec_ctx->coded_frame->pkt_dts; video_output_file->sample->CTS_Offset = (s32) (video_codec_ctx->coded_frame->pts - video_output_file->sample->DTS); video_output_file->sample->IsRAP = video_codec_ctx->coded_frame->key_frame; GF_LOG(GF_LOG_DEBUG, GF_LOG_DASH, ("Isom Write: RAP %d , DTS "LLD" CTS offset %d \n", video_output_file->sample->IsRAP, video_output_file->sample->DTS, video_output_file->sample->CTS_Offset)); ret = gf_isom_fragment_add_sample(video_output_file->isof, video_output_file->trackID, video_output_file->sample, 1, video_output_file->use_source_timing ? (u32) video_output_file->frame_dur : 1, 0, 0, 0); if (ret != GF_OK) { gf_bs_del(out_bs); GF_LOG(GF_LOG_ERROR, GF_LOG_DASH, ("%s: gf_isom_fragment_add_sample\n", gf_error_to_string(ret))); return -1; } //free data but keep sample structure alive gf_free(video_output_file->sample->data); video_output_file->sample->data = NULL; video_output_file->sample->dataLength = 0; gf_bs_del(out_bs); return 0; }